package ar.uade.distribuidas.tpo.base.remoto;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import java.util.Map;
import java.util.Set;

import ar.uade.distribuidas.tpo.base.dominiodto.ClienteDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.CondicionDeVentaDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.CotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.EstadoItemPedido;
import ar.uade.distribuidas.tpo.base.dominiodto.FacturaDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemCotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemPedidoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemRemitoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemSolicitudDeCotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.OrdenDeCompraDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.OrdenDePedidoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.PoliticaDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ProveedorDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RemitoCPEDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RemitoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RodamientoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.SolicitudDeCotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.StockDTO;

public interface IGestion extends Remote{
	//Clientes
	public void altaCliente(ClienteDTO cDTO) throws RemoteException;
	public void bajaCliente(ClienteDTO cDTO) throws RemoteException; 
	public void modificarCliente(ClienteDTO cDTO) throws RemoteException;
	public List<ClienteDTO> getClientes() throws RemoteException;
	public ClienteDTO getCliente(Long cuil)throws RemoteException;
	public ClienteDTO save(ClienteDTO c) throws RemoteException;
	
	//Cotizacion
	public void saveCotizacion(CotizacionDTO c) throws RemoteException;
	public void updateCotizacion(CotizacionDTO c) throws RemoteException;
	public CotizacionDTO getCotizacion(Long long1) throws RemoteException;
	public CotizacionDTO crearCotizacion(SolicitudDeCotizacionDTO sdto) throws RemoteException;
	//ListaPrecio
	public void crearListaPrecio(ProveedorDTO pDTO) throws RemoteException;
	public ListaPrecioDTO getListaPrecio(long id) throws RemoteException;
	public void actualizarListaPrecio(ProveedorDTO pDTO) throws RemoteException;
	void crearListaPrecio(ListaPrecioDTO lDTO) throws RemoteException;
	
	//Orden de pedido
	public void altaOrdenDePedido (OrdenDePedidoDTO opDTO) throws RemoteException;
	public OrdenDePedidoDTO getOrdenDePedido(Long long1) throws RemoteException;
	public void cambiarEstadoItem (Long long1,EstadoItemPedido estadoNuevo) throws RemoteException;
	
	/**
	 * Devuelve el mejor precio para un rodamiento junto con la cantidad que
	 * puede pedir.
	 * 
	 * @param i
	 * @return
	 */
	public ItemListaPrecioDTO getMejorPrecio(RodamientoDTO i, int cant) throws RemoteException;

	//Remito
	public List<RemitoDTO> procesarItemsPedidoComprados() throws RemoteException;
	
	//Orden Compra
	public List<OrdenDeCompraDTO> comprarRodamientos() throws RemoteException;
	public void recibirMercaderia(Set<RemitoCPEDTO> lop) throws RemoteException;
	public OrdenDeCompraDTO getOrdenCompra (int ordenCompraNumero) throws RemoteException;
	public void altaOC(OrdenDeCompraDTO oc) throws RemoteException;
	
	//Politica
	public void elegirMedioPago(PoliticaDTO medioPago) throws RemoteException;
	public void altaMedioPago(PoliticaDTO medioPago) throws RemoteException;
	public void bajaMedioPago(String id) throws RemoteException;
	
	//Proveedor
	public void altaProveedor (ProveedorDTO pDTO) throws RemoteException;
	public void modificarProveedor (ProveedorDTO pDTO) throws RemoteException;
	public void bajaProveedor(Long cuil) throws RemoteException;
	public List<ProveedorDTO> getProveedores() throws RemoteException;
	public ProveedorDTO getProveedor(Long cuil)throws RemoteException;
	public ProveedorDTO save(ProveedorDTO c)throws RemoteException;
	
	
	//Rodamientos

	/**
	 * Dada algo de la info de un rodamiento(marca y/o sufijo, etc) devuelve si
	 * existe un rodamiento que cumpla esas caracteristicas
	 * 
	 * @param rodamiento
	 * @return
	 */
	public boolean existeRodamiento(RodamientoDTO rodamiento) throws RemoteException;

	/**
	 * Dada toda de la info de un rodamiento(nro serie, marca, sufijo, pais)
	 * devuelve el dto del rodamiento 
	 * 
	 * @param rodamiento
	 * @return
	 */
	public RodamientoDTO getRodamiento(RodamientoDTO rodamiento) throws RemoteException;
	public RodamientoDTO getRodamiento(long serie, String sufijo, String marca, String pais) throws RemoteException;
	public void altaRodamiento(RodamientoDTO rDTO)throws RemoteException;
	//SolicitudCotizacion
	public void altaSolicitudDeCotizacion(SolicitudDeCotizacionDTO sc) throws RemoteException;
	public void updateSolicitudDeCotizacion(SolicitudDeCotizacionDTO c) throws RemoteException;
	public SolicitudDeCotizacionDTO getById(Long long1) throws RemoteException;
	public int getNextItemSCNumber() throws RemoteException;
	public ItemSolicitudDeCotizacionDTO getItemSolicitudDeCotizacion(Long long1) throws RemoteException;
	
	//Stock
	//Este solamente agrega el rodamiento a la tabla stock, con cantidad = 0
	public void altaStock(StockDTO sDTO) throws RemoteException;
	
	//Este con el rodamiento existente le agrega la cantidad de stock
	public void aumentarStock (RodamientoDTO rodamiento, int cant) throws RemoteException;
	public void descontarStock (RodamientoDTO rodamiento, int cant) throws RemoteException;
	public void bajaStock (StockDTO sDTO) throws RemoteException;

	
	//CondicionDeVenta
	public void guardarCondicionVenta(CondicionDeVentaDTO condVent) throws RemoteException;
	public void modificarCondicionVenta(CondicionDeVentaDTO condVent) throws RemoteException;
	public CondicionDeVentaDTO getCondicionDeVentaDTO(int id) throws RemoteException;
	
	//Remito
	public void altaRemito(RemitoDTO remitoDTO)throws RemoteException;
	public List<RemitoDTO> getRemitosEmitidos(long cuilCliente)throws RemoteException;
	
	//Factura
	public void altaFactura(FacturaDTO factura)throws RemoteException;
	public int getProximoNumeroFactura()throws RemoteException;
	public void saveRodamiento(RodamientoDTO rodamiento) throws RemoteException;
	
	//OrdenPedido e TtemPedido
	public List<ItemPedidoDTO> getItemsPedidoPendiente() throws RemoteException;
	public List<ItemPedidoDTO> getItemsPedidoComprados() throws RemoteException;
	
	public ItemListaPrecioDTO getItemListaPrecio(int itemListaPrecioId) throws RemoteException;
	public ItemCotizacionDTO getItemCotizacion(Long long1) throws RemoteException;
	public List<OrdenDePedidoDTO> getOrdenesPedidoByCliente(long cuil) throws RemoteException;
	public List<ItemPedidoDTO> getItemsPedidoByEstado(EstadoItemPedido estado) throws RemoteException;
	public void enviarMercaderia(Set<RemitoDTO> remitos) throws RemoteException;
	public List<ItemPedidoDTO> getItemsPedidoEnviadosByCliente(long cuil,
			EstadoItemPedido estado) throws RemoteException;
	public Map<Long, ItemRemitoDTO> getMapItemPedidoItemRemito(List<ItemPedidoDTO> pedidos)
			throws RemoteException;
	public RemitoDTO getRemitoByNumero(int numero) throws RemoteException;
	
	/**
	 * Magia
	 * le pasas la clase del objeto y su id, lo busca y te devuelve el DTO de esa clase
	 * 
	 * @param clazz
	 * @param id
	 * @return clazz.toDTO()
	 * @throws RemoteException
	 */
//	public Object getClassById(Class clazz, Object id) throws RemoteException;
}
